﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class Maker {
public:
	Maker() {
		cout << "构造函数" << endl;
	}

	Maker(int n) {
		cout << "有参构造函数" << endl;
	}

	~Maker() {
		cout << "析构函数" << endl;
	}
};

// 1. new创建基础类型的数组 
void test01() {
	// 申请基础类型的数组 
	int *pInt = new int[10]{1,2,3,4,5,6,7,8,9,10}; // 使用{}初始化，不推荐  
	// 使用for循环初始化数组  
	for (int i = 0; i < 10; i++) {
		pInt[i] = i + 1;
	}
	for (int i = 0; i < 10; i++) {
		cout << pInt[i] << " ";
	}
	cout << endl; 
	// 释放数组使用delete[]，规则：new时有中括号[]，则delete时也要有中括号[] 
	delete[] pInt; 
	pInt = NULL; 

	char * pChar = new char[64];
	memset(pChar, 0, 64);
	strcpy(pChar, "小花");
	cout << pChar << endl;	
}

// 2. new创建对象类型数组 
void test02() {
	// 数组中的每个元素的创建都调用无参构造函数，且只能调用无参构造函数 
	Maker *ms = new Maker[2]; 
	delete[] ms;
	ms = NULL;

	// 聚合初始化，调用指定构造函数，但大部分编译器不支持这种写法 
	Maker *ms2 = new Maker[3]{ Maker(10), Maker(20), Maker(30) }; 
	delete[] ms2;
	ms2 = NULL;
}

// 3. delete void* 可能出错，不会调用对象的析构函数，因为void没指定类型，编译器管理不到析构函数 
// 编译时确定函数调用的地址，这种方式叫做静态联编 
void test03() {
	void *m = new Maker;
	delete m; // 如果用void *来接new出来的对象，delete则不会调用析构函数 
}

int main()
{
	// test01();
	// test02(); 
	test03(); 

	system("pause");
	return EXIT_SUCCESS;
}